﻿using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QbservableHubTests
{
    /// <summary>
    /// Test sample for json converter
    /// </summary>
    public class CustomJsonConverter : JsonConverter
    {
        #region CanConvert

        /// <summary>
        /// Determines whether this instance can convert the specified object type.
        /// </summary>
        /// <param name="objectType">Type of the object.</param>
        /// <returns>
        ///   <c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.
        /// </returns>
        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(string);
        }

        #endregion // CanConvert

        #region ReadJson

        /// <summary>
        /// Reads the JSON representation of the object.
        /// </summary>
        /// <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader" /> to read from.</param>
        /// <param name="objectType">Type of the object.</param>
        /// <param name="existingValue">The existing value of object being read.</param>
        /// <param name="serializer">The calling serializer.</param>
        /// <returns>
        /// The object value.
        /// </returns>
        public override object ReadJson(
         JsonReader reader,
         Type objectType,
         object existingValue,
         JsonSerializer serializer)
        {
            var value = (string)reader.Value;

            switch (value)
            {
                case "W":
                    value = "Where";
                    break;
                case "S":
                    value = "Select";
                    break;
            }
            return value;
        }

        #endregion // ReadJson

        #region WriteJson

        /// <summary>
        /// Writes the JSON representation of the object.
        /// </summary>
        /// <param name="writer">The <see cref="T:Newtonsoft.Json.JsonWriter" /> to write to.</param>
        /// <param name="value">The value.</param>
        /// <param name="serializer">The calling serializer.</param>
        public override void WriteJson(
            JsonWriter writer,
            object value,
            JsonSerializer serializer)
        {
            switch ((string)value)
            {
                case "Where":
                    value = "W";
                    break;
                case "Select":
                    value = "S";
                    break;
            }
            writer.WriteValue(value);
        }

        #endregion // WriteJson
    }
}
